package cc.devclub.ftd.thread.create;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 实现Callable接口
 * <p>
 * （1）创建Callable接口的实现类，并实现call()方法，该call()方法将作为线程执行体，并且有返回值。
 * <p>
 * （2）创建Callable实现类的实例，使用FutureTask类来包装Callable对象，该FutureTask对象封装了该Callable对象的call()方法的返回值。
 * <p>
 * （3）使用FutureTask对象作为Thread对象的target创建并启动新线程。
 * <p>
 * （4）调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
 * <p>
 * 演示场景：售票员售票
 *
 * @Author: 【我是开发者FTD】公众号 微信号：ForTheDevelopers
 */
public class MyCallableThread implements Callable<String> {

    // 总票数
    private int count = 10;

    @Override
    public String call() throws Exception {
        // 当还有票时就继续售卖
        while (count > 0) {
            // 剩余票数
            count--;
            System.out.println(
                    Thread.currentThread().getName() + "售卖第 " + (10 - count) + " 张票,当前剩余票数: " + count);
        }
        return "票已售完";
    }

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        Callable<String> callable = new MyCallableThread();
        FutureTask<String> futureTask = new FutureTask<>(callable);
        Thread myThread = new Thread(futureTask);
        myThread.start();
        // 打印返回结果
        System.out.println(futureTask.get());
    }
}